package com.ants.boot.utils;

import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import java.util.*;

/**
 * @author 蚂蚁会花呗
 * @date 2021/7/20 17:25
 * net.sf.json
 * json-lib 工具类
 *
 */
public class JsonUtils {

    /**
     * @param json json格式对象
     * @param jsonKey key值
     * @return key值所对应的value值
     */
    public static String getJsonValue(String json,String jsonKey){
        JSONObject jsonObject = JSONObject.fromObject(json);
        String value = "";
        if (jsonObject.containsKey(jsonKey)) {
            value = jsonObject.getString(jsonKey);
        }
        return value;
    }
    /**
     * 将对象转换为json格式字符串
     * @param object
     * @return json格式字符串数据
     */
    public static String toJsonString(Object object){
        return JSONObject.fromObject(object).toString();
    }

    /**
     * 将json对象转换为json字符串
     * @param jsonObject
     * @return json字符串
     */
    public static String toJsonString(JSONObject jsonObject){
        return jsonObject.toString();
    }

    /**
     * 将jsonarray数组转换为json字符串
     * @param jsonArray
     * @return json字符串
     * @throws JSONException
     */
    public static String toJsonString(JSONArray jsonArray){
        return jsonArray.toString();
    }

    /**
     * 将对象转换为json对象
     * @param object 对象
     * @return json对象
     * @throws JSONException
     */
    public static JSONObject toJSONObject(Object object){
        return JSONObject.fromObject(object);
    }

    /**
     * 将对象转换为jsonarray数组
     * @param object
     * @return JSONArray 数组
     */
    public static JSONArray toJSONArray(Object object){
        return JSONArray.fromObject(object);
    }


    /**
     * 将List对象序列化为JSON文本
     * @param list list对象
     * @return 返回list格式的json对象
     */
    public static <T> String toJsonStringByList(List<T> list){
        JSONArray jsonArray = JSONArray.fromObject(list);
        return jsonArray.toString();
    }


    /**
     * 将对象转换为list数组
     * @param object 对象
     * @param objeclClass 对象类型
     * @return 返回list对象数组
     */
    @SuppressWarnings({ "deprecation", "unchecked" })
    public static <T> List<T> toList(Object object,Class<T> objeclClass){
        JSONArray array = JSONArray.fromObject(object);
        return JSONArray.toList(array, objeclClass);
    }

    /**
     * 将json对象转换为传入类型的对象
     * @param jsonObject
     * @param beanClass
     * @return T
     */
    @SuppressWarnings("unchecked")
    public static <T> T toBean(JSONObject jsonObject,Class<T> beanClass){
        return (T) JSONObject.toBean(jsonObject, beanClass);
    }

    /**
     * 将对象转换为传入类型的对象
     * @param object
     * @param beanClass
     * @return 返回T
     */
    @SuppressWarnings("unchecked")
    public static <T> T toBean(Object object,Class<T> beanClass){
        JSONObject jsonObject = JSONObject.fromObject(object);
        return (T) JSONObject.toBean(jsonObject, beanClass);
    }


    /**
     * json字符串 转为 map
     * @param jsonStr
     * @return
     */
    public static Map<String, Object> parseToMap(String jsonStr){
        Map<String, Object> map = new HashMap<String, Object>();
        //最外层解析
        JSONObject json = JSONObject.fromObject(jsonStr);
        for(Object k : json.keySet()){
            Object v = json.get(k);
            //如果内层还是数组的话，继续解析
            if(v instanceof JSONArray){
                List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
                Iterator<JSONObject> it = ((JSONArray)v).iterator();
                while(it.hasNext()){
                    JSONObject json2 = it.next();
                    list.add(parseToMap(json2.toString()));
                }
                map.put(k.toString(), list);
            } else {
                map.put(k.toString(), v);
            }
        }
        return map;
    }

}
